home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smb_sid2localuser.nasl < prev    next >
Text File  |  2005-01-14  |  15KB  |  569 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7.  
  8. if(description)
  9. {
  10.  script_id(10860);
  11.  script_bugtraq_id(959);
  12. script_cve_id("CVE-2000-1200");
  13.  script_version ("$Revision: 1.23 $");
  14.  
  15.  name["english"] = "SMB use host SID to enumerate local users";
  16.  name["francais"] = "Usage du SID de la machine pour obtenir les noms d'utilisateurs locaux";
  17.  
  18.  script_name(english:name["english"],
  19.           francais:name["francais"]);
  20.  
  21.  desc["english"] = "
  22.  
  23. This script uses the host SID to enumerates
  24. the local users ID from 1000 to 1200 (or whatever you
  25. set this to, in the preferences)
  26.  
  27. Risk factor : Medium";
  28.  
  29.  desc["francais"] = "
  30.  
  31. Ce script utilise le SID du domaine pour Θnumerer
  32. les utilisateurs d'id 1000 α 1200 (ou quoi que vous mettiez,
  33. dans les preferences)";
  34.  
  35.  script_description(english:desc["english"],
  36.              francais:desc["francais"]);
  37.  
  38.  summary["english"] = "Enumerates users";
  39.  summary["francais"] = "Enumeration des utilisateurs";
  40.  script_summary(english:summary["english"],
  41.          francais:summary["francais"]);
  42.  
  43.  script_category(ACT_GATHER_INFO);
  44.  
  45.  script_copyright(english:"This script is Copyright (C) 2000, 2001 Renaud Deraison");
  46.  family["english"] = "Windows";
  47.  script_family(english:family["english"]);
  48.  
  49.  script_dependencies("netbios_name_get.nasl",
  50.               "smb_login.nasl",
  51.              "smb_host2sid.nasl");
  52.  script_require_keys("SMB/transport", "SMB/name", "SMB/login", "SMB/password", "SMB/host_sid");
  53.  script_require_ports(139, 445);
  54.  script_add_preference(name:"Start UID : ", type:"entry", value:"1000");
  55.  script_add_preference(name:"End UID : ", type:"entry", value:"1200");
  56.  
  57.  exit(0);
  58. }
  59.  
  60. include("smb_nt.inc");
  61. port = kb_smb_transport();
  62. if(!port)port = 139;
  63. if(!get_port_state(port))exit(0);
  64. __start_uid = script_get_preference("Start UID : ");
  65. __end_uid   = script_get_preference("End UID : ");
  66.  
  67. if(__end_uid < __start_uid)
  68. {
  69.  t  = __end_uid;
  70.  __end_uid = __start_uid;
  71.  __start_uid = t;
  72. }
  73.  
  74. if(!__start_uid)__start_uid = 1000;
  75. if(!__end_uid)__end_uid = __start_uid + 200;
  76.  
  77. #-------------------------------------------------------------#
  78. # return a 28 + strlen(data) + (odd(data)?0:1) long string    #
  79. #-------------------------------------------------------------#
  80. function lsa_unicode(data)
  81. {
  82.  len = strlen(data);
  83.  ret = raw_string(ord(data[0]));
  84.  
  85.  for(i=1;i<len;i=i+1)
  86.  {
  87.   ret = ret + raw_string(0, ord(data[i]));
  88.  }
  89.  
  90.  
  91.  if(!(len & 1)){even = 1;}
  92.  else even = 0;
  93.  
  94.  
  95.  if(even)
  96.   {
  97.   ret = ret + raw_string(0,0,0,0xC9, 0x11, 0x18);
  98.   }
  99.  else
  100.   ret = ret + raw_string(0,0,0,0x18);
  101.  
  102.  for(i=0;i<19;i=i+1)
  103.   ret = ret + raw_string(0);
  104.   
  105.  return(ret);
  106. }
  107.  
  108. #-------------------------------------------------------------#
  109. # convert a 4 bytes value to a long                         #
  110. #-------------------------------------------------------------#            
  111. function long(s, index)
  112. {
  113.  num = ord(s[index+3]);
  114.  a = num*256;
  115.  num = ord(s[index+2]);
  116.  num = num + a;
  117.  a = num*256;
  118.  num = ord(s[index+1]);
  119.  num = num+a;
  120.  a = num*256;
  121.  num = ord(s[index]);
  122.  num = num+a;
  123.  return(num);
  124. }
  125.  
  126. #---------------------------------------------------------#
  127. # hexstr() to raw_string() conversion              #
  128. #---------------------------------------------------------#
  129.  
  130. function hexsid_to_rawsid(s)
  131. {
  132.  local_var i, j, ret;
  133.  
  134.  for(i=0;i<strlen(s);i+=2)
  135.  {
  136.   if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9"))
  137.       j = int(s[i]);
  138.   else
  139.       j = int((ord(s[i]) - ord("a")) + 10);
  140.  
  141.   j *= 16;
  142.   if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9"))
  143.       j += int(s[i+1]);
  144.   else
  145.       j += int((ord(s[i+1]) - ord("a")) + 10);
  146.   ret += raw_string(j);
  147.  }
  148.  return ret;
  149. }
  150.  
  151.  
  152. #---------------------------------------------------------#
  153. # Decode the username we got                              #
  154. #---------------------------------------------------------#
  155. function decode_username(s)
  156. {
  157.  data_offset = ord(s[52]) * 256;
  158.  data_offset = data_offset + ord(s[51]);
  159.  
  160.  pad = ord(s[59]);
  161.  
  162.  
  163.  index = data_offset + 4; 
  164.  mac_len = ord(s[125]);
  165.  mac_len = mac_len * 256;
  166.  mac_len = mac_len + ord(s[124]);
  167.  
  168.  index = index + mac_len + mac_len + 2 + 130;
  169.  
  170.  odd = mac_len & 1;
  171.  
  172.  if(odd)index = index + 2;
  173.  
  174.  name_len = ord(s[index+1]);
  175.  name_len = name_len * 256;
  176.  
  177.  name_len = name_len + ord(s[index]);
  178.  
  179.  name_len = name_len * 2;
  180.  if(!name_len)return(FALSE);
  181.  name = "";
  182.  index = index+4;
  183.  for(i=0;i<name_len;i=i+2)
  184.  {
  185.   name = string(name, raw_string(ord(s[index+i])));
  186.  }
  187.  return(name);
  188. }            
  189.  
  190.  
  191.  
  192. #---------------------------------------------------------#
  193. # Do something that we need for the rest                  #
  194. #---------------------------------------------------------#
  195.         
  196. function pipe_request_lsa_open_policy_setup(soc, uid, tid, pipe)
  197. {
  198.  tid_low = tid % 256;
  199.  tid_high = tid / 256;
  200.  uid_low = uid % 256;
  201.  uid_high = uid / 256;
  202.  pipe_low = pipe % 256;
  203.  pipe_high = pipe / 256;
  204.  
  205.  req = raw_string(0x00, 0x00,
  206.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  207.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  208.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  209.           0x00, 0x06, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  210.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  211.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  212.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  213.           0x00, 0x48, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  214.           0x00, pipe_low, pipe_high, 0x51, 0x00, 0x5C, 0x50, 0x49,
  215.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  216.           0x0B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  217.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16,
  218.           0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  219.           0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x57,
  220.           0x34, 0x12, 0x34, 0x12, 0xCD, 0xAB, 0xEF, 0x00,
  221.           0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0x00, 0x00,
  222.           0x00, 0x00, 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C,
  223.           0xc9, 0x11, 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10,
  224.           0x48, 0x60, 0x02, 0x00, 0x00, 0x00);      
  225.  send(socket:soc, data:req);
  226.  r = smb_recv(socket:soc, length:4096);
  227.  if(!r)return(FALSE);
  228.  if(ord(r[9])==0)return(r);
  229.  else return(FALSE);
  230. }
  231.  
  232.  
  233. #-----------------------------------------------------------------#
  234. # First step : we do _some_ request and we are returned a magic   #
  235. # number that we will use in step 2                               #
  236. #                                                                 #
  237. # (things are starting to get complicated)                        #
  238. #                                                                 # 
  239. #-----------------------------------------------------------------#
  240.  
  241. function pipe_request_lsa_open_policy_step1(soc, uid, tid, pipe, name)
  242. {
  243.  
  244.  
  245.  tid_low = tid % 256;
  246.  tid_high = tid / 256;
  247.  
  248.  uid_low = uid % 256;
  249.  uid_high = uid / 256;
  250.  
  251.  pipe_low = pipe % 256;
  252.  pipe_high = pipe / 256;
  253.  
  254.  
  255.  uc= lsa_unicode(data:tolower(name));
  256.  tot_len = 132 + strlen(uc);
  257.  
  258.  data_count = 60 + strlen(uc);
  259.  data_count_low  = data_count % 256;
  260.  data_count_high = data_count / 256;
  261.  
  262.  
  263.  len = strlen(name) + 1;
  264.  
  265.  len_low = len % 256;
  266.  len_high = len / 256;
  267.  
  268.  total_data_count = 56 + strlen(uc); 
  269.  total_data_count_low = total_data_count % 256;
  270.  total_data_count_high = total_data_count / 256;
  271.  tot_len_low = tot_len % 256;
  272.  tot_len_high = tot_len / 256;
  273.  bcc = 65 + strlen(uc);
  274.  bcc_low = bcc % 256;
  275.  bcc_high = bcc / 256;
  276.  
  277.  x =  32 + strlen(uc);
  278.  x_low = x % 256;
  279.  x_high = x / 256;
  280.  
  281.  y= 138 + strlen(uc);
  282.  y_low = y % 256;
  283.  y_high = y / 256;
  284.  
  285.  h = raw_string(0x00, 0x00, 
  286.            tot_len_high, tot_len_low, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  287.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x26, 0x83,
  288.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  289.           0x00, 0x00, tid_low, tid_high,  0x00, 0x28, uid_low, uid_high,
  290.           g_mlo, g_mhi, 0x10, 0x00, total_data_count_high, total_data_count_low, 0x00, 0x00,
  291.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  292.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  293.           total_data_count_high, total_data_count_low, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  294.           0x00, pipe_low, pipe_high, bcc_low, bcc_high, 0x5C, 0x50, 0x49,
  295.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  296.           0x00, 0x03, 0x10, 0x00, 0x00, total_data_count_high, total_data_count_low, 0x00, 
  297.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, x_low, x_high,
  298.           0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, y_low, 0x48,
  299.           0x13, 0x00, len_low, len_high, 0x00, 0x00, 0x00, 0x00,
  300.           0x00, 0x00, len_low, len_high, 0x00, 0x00)
  301.           + uc + raw_string(
  302.           0xA4, 0xF2, 
  303.           0x12, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 
  304.           0x01, 0x00, 0x00, 0x08, 0x00, 0x00);
  305.           
  306.  send(socket:soc, data:h);
  307.  r = smb_recv(socket:soc, length:4096);
  308.  if(!r)return(FALSE);
  309.  if(ord(r[9])==0)return(r);
  310.  else return(FALSE);
  311. }
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318. #-----------------------------------------------------------------------#
  319. # This function requests the name of the user of id <id>                #
  320. #-----------------------------------------------------------------------#
  321.  
  322.  
  323.  
  324.  
  325. function pipe_request_get_username(soc, uid, tid, pipe, name, reply,id, sid)                
  326. {
  327.  
  328.  
  329.  tid_low = tid % 256;
  330.  tid_high = tid / 256;
  331.  
  332.  uid_low = uid % 256;
  333.  uid_high = uid / 256;
  334.  
  335.  pipe_low = pipe % 256;
  336.  pipe_high = pipe / 256;
  337.  
  338.  id_low = id % 256;
  339.  id_high =  id / 256;
  340.  
  341.   
  342.   req = raw_string(0x00, 0x00,
  343.             0x00, 0xC4, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  344.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, ord(reply[16]),ord(reply[17]),
  345.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  346.           0x00, 0x00, tid_low, tid_high, 0x00, 0x00, uid_low, uid_high,
  347.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x6C, 0x00, 0x00,
  348.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  349.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  350.           0x00, 0x6C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  351.           0x00, pipe_low, pipe_high, 0x7D, 0x00, 0x00, 0x5C, 0x00,
  352.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  353.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
  354.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x6C, 0x00,
  355.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x00,
  356.           0x00, 0x00, 0x00, 0x00, 0x0F, 0x00);
  357.     
  358.   magic = raw_string(ord(reply[84]));          
  359.   for(i=1;i<20;i=i+1)
  360.   {
  361.    magic = magic + raw_string(ord(reply[84+i]));
  362.   }
  363.   
  364.  
  365.   
  366.   req = req + magic + raw_string(0x01, 0x00, 0x00,0x00, 0xD8, 0xF2,
  367.           0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x3A,
  368.         0x13, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x05,
  369.         0x00, 0x00, 0x00, 0x00) + sid + raw_string( id_low, id_high,
  370.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  371.         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  372.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
  373.  
  374.   send(socket:soc, data:req);
  375.   r = smb_recv(socket:soc, length:65000);
  376.   length_answer = ord(r[2]);
  377.   length_answer = length_answer * 256;
  378.   
  379.   length_answer = length_answer + ord(r[3]);
  380.   
  381.   
  382.   v = ord(r[length_answer+3]);
  383.   if(v==192){
  384.       return(FALSE);
  385.       }
  386.   return(r);  
  387. }
  388.  
  389.  
  390. #--------------------------------------------------------------#
  391. #  main function to retrieve a username                        #
  392. #--------------------------------------------------------------#
  393. function get_name(soc, uid,tid, pipe, name, id, sid, hdl)
  394. {
  395.  
  396. #
  397. # Get the SID
  398. #
  399. r = pipe_request_get_username(soc:soc, uid:uid, tid:tid,
  400.                    pipe:pipe,name:name, reply:hdl, id:id, sid:sid);
  401.  
  402.  
  403. if(r)
  404.  {
  405.   if(strlen(r) > 125)
  406.   {
  407.   r = decode_username(s:r);
  408.   return(r);
  409.   }
  410.   else return(FALSE);
  411.  }
  412.  else return(FALSE);
  413. }
  414.  
  415.  
  416.  
  417. #==============================================================#
  418. # Section 3. Entry point of the plugin                         #
  419. #==============================================================#
  420.  
  421.  
  422.  
  423. __no_enum = get_kb_item("SMB/LocalUsers/0");
  424. if(__no_enum)exit(0);
  425.  
  426. __no_enum = get_kb_item("SMB/LocalUsers/1");
  427. if(__no_enum)exit(0);
  428.  
  429.  
  430. # we need the  netbios name of the host
  431. name = kb_smb_name();
  432. if(!name)exit(0);
  433.  
  434.  
  435. login = kb_smb_login();
  436. pass  = kb_smb_password();
  437. if(!login)login = "";
  438. if(!pass)pass = "";
  439.  
  440. domain = kb_smb_domain();
  441.  
  442.  
  443. # we need the SID of the domain
  444. sidx = get_kb_item("SMB/host_sid_hex");
  445. if(!sidx)exit(0);
  446.  
  447.  
  448. # conversion string -> hex
  449. sid = hexsid_to_rawsid(s:sidx);
  450.  
  451.  
  452. soc = open_sock_tcp(port);
  453. if(!soc)exit(0);
  454.  
  455.  
  456. #
  457. # Request a new session
  458. r = smb_session_request(soc:soc,  remote:name);
  459. if(!r)exit(0);
  460.  
  461. #
  462. # Negociate the protocol
  463. #
  464. prot = smb_neg_prot(soc:soc);
  465. if(!prot)exit(0);
  466.  
  467. #
  468. # Set up our null session
  469. #
  470. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  471. if(!r)exit(0);
  472. # and extract our uid
  473. uid = session_extract_uid(reply:r);
  474.  
  475. #
  476. # Connect to the remote IPC and extract the TID
  477. # we are attributed
  478. #      
  479. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  480. # extract our tree id
  481. tid = tconx_extract_tid(reply:r);
  482.  
  483.  
  484. #
  485. # Create a pipe to lsarpc
  486. #
  487. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\lsarpc");
  488. if(!r)exit(0);
  489. # and extract its ID
  490. pipe = smbntcreatex_extract_pipe(reply:r);
  491.  
  492.  
  493. #
  494. # Setup things
  495. #
  496. r = pipe_request_lsa_open_policy_setup(soc:soc, uid:uid, tid:tid, pipe:pipe);
  497.  
  498.  
  499. num_users = 0;
  500. set_kb_item(name:"SMB/LocalUsers/enumerated", value:TRUE);
  501. report = string("The host SID could be used to enumerate the names of the local users\n",
  502.         "of this host. \n",
  503.         "(we only enumerated users name whose ID is between ",
  504.         __start_uid," and ", __end_uid, "\n",
  505.         "for performance reasons)\n",
  506.         "This gives extra knowledge to an attacker, which\n",
  507.         "is not a good thing : \n");
  508.         
  509.  
  510.  
  511. #
  512. # Get the magic number
  513. #
  514. lsa = pipe_request_lsa_open_policy_step1(soc:soc, uid:uid, tid:tid, pipe:pipe,name:name);
  515. if(!lsa)exit(0);
  516.  
  517.         
  518. n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe, name:name, hdl:lsa, id:500, sid:sid);
  519. if(n)
  520.  {
  521.  num_users = num_users + 1;
  522.  report = report + string("- Administrator account name : ", n, " (id 500)\n");
  523.  set_kb_item(name:string("SMB/LocalUsers/", num_users), value:n);
  524.  set_kb_item(name:"SMB/LocalAdminName", value:n);
  525.  }
  526.  
  527.  
  528.  
  529. n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe, name:name, id:501, hdl:lsa);
  530. if(n)
  531.  {
  532.   report = report + string("- Guest account name : ", n, " (id 501)\n");
  533.   num_users = num_users + 1;
  534.   set_kb_item(name:string("SMB/LocalUsers/", num_users), value:n);
  535.  }
  536.  
  537. #
  538. # Retrieve the name of the users between __start_uid and __start_uid
  539. #
  540.  
  541.  
  542. mycounter = __start_uid;
  543.  
  544. while(1)
  545. {
  546.  
  547.  n = get_name(soc:soc, uid:uid,tid:tid, pipe:pipe,hdl:lsa, name:name, id:mycounter);
  548.  if(n)
  549.  {
  550.   report = report + string("- ", n, " (id ", mycounter, ")\n");
  551.   num_users = num_users + 1;
  552.   set_kb_item(name:string("SMB/LocalUsers/", num_users), value:n);
  553.  }
  554.  else if(mycounter > __end_uid)break;
  555.  mycounter ++;
  556. }
  557.  
  558. close(soc);
  559. report = report + string(
  560.     "\nRisk factor : Medium\n",
  561.     "Solution : filter incoming connections this port\n");
  562.  
  563.     
  564. if(num_users > 0)
  565.  {
  566.  security_warning(data:report, port:port);
  567.  }
  568.